package com.bds.btcdc.web.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by DongChenchen on 2018/5/4 0004
 * 波动率计算
 */
public class FluctuationRatioUtils {

    //计算每hours个小时的波动率
    //data 每分钟 数字货币的价格
    public static BigDecimal getFluctuationRatio(List<BigDecimal> data,Integer hours){
        //1、从市场上获得标的股票在固定时间间隔(如每天、每周或每月等)上的价格。 
        //2、对于每个时间段,求出该时间段末的股价与该时段初的股价之比的自然对数。
        //3、求出这些对数值的标准差,再乘以一年中包含的时段数量的平方根(如,选取时间间隔为每天,则若扣除闭市,每年中有250个交易日,应乘以根号250),得到的即为历史波动率
        int size = data.size();
        if(size>0){
            //与上一分钟的比值,并求对数
            BigDecimal [] divs=new BigDecimal[size-1];
            for(int i=1;i<size;i++){
                BigDecimal div = data.get(i - 1).divide(data.get(i), Const.BDM_SCALE,BigDecimal.ROUND_HALF_UP);
                divs[i-1]=BigDecimal.valueOf(Math.log(div.doubleValue()));
            }
            //求均值
            BigDecimal sum=BigDecimal.ZERO;
            for(BigDecimal div:divs){
                sum=sum.add(div);
            }
            BigDecimal avg = sum.divide(BigDecimal.valueOf(divs.length / 1.0), Const.BDM_SCALE, BigDecimal.ROUND_HALF_UP);
            //求标准差
            BigDecimal sqrt_sum=BigDecimal.ZERO;//平方差 的和
            for(BigDecimal div:divs){
                sqrt_sum=sqrt_sum.add(div.subtract(avg).pow(2));
            }
            BigDecimal divide = sqrt_sum.divide(BigDecimal.valueOf(divs.length - 1 / 1.0), Const.BDM_SCALE, BigDecimal.ROUND_HALF_UP);
            BigDecimal sqrt = BigDecimal.valueOf(Math.sqrt(divide.doubleValue()));
            return sqrt.multiply(BigDecimal.valueOf(Math.sqrt(hours*60)));
        }
        return null;
    }


    public static void main(String[]args){
        BigDecimal [] datas=new BigDecimal[]{
                BigDecimal.valueOf(9001.1),
                BigDecimal.valueOf(9010.1),
                BigDecimal.valueOf(9100.1),
                BigDecimal.valueOf(9000.1),
                BigDecimal.valueOf(9020.1),
        };
        List<BigDecimal> data=new ArrayList<>();
            data.addAll(Arrays.asList(datas));
        BigDecimal res = FluctuationRatioUtils.getFluctuationRatio(data, 1);
        System.out.println(res);
    }
}
